package middleware

import (
	"Bok/utils"
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// 白名单
// 定义不需要Token校验的路由白名单（路径+方法）
var skipAuthPaths = map[string]struct{}{
	// 格式："请求方法:路径" => struct{}{}
	"POST:/public/login": {}, // 登录接口
}

// JWT 认证中间件
func JWTAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 1. 构建当前请求的"方法:路径"字符串
		// 注意：路径需标准化（去除多余斜杠、处理参数）
		path := c.Request.URL.Path
		method := c.Request.Method
		key := method + ":" + path
		fmt.Println("1:", key)
		fmt.Println("2:", skipAuthPaths)
		// 2. 检查是否在白名单中，若是则直接放行
		if _, ok := skipAuthPaths[key]; ok {
			c.Next() // 跳过后续校验，直接执行路由处理函数
			return
		}
		// 获取 Authorization header
		authHeader := c.GetHeader("Authorization")
		if authHeader == "" {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required,需要携带 token"})
			c.Abort()
			return
		}

		// 提取 Token 字符串
		tokenString, err := utils.ExtractTokenFromHeader(authHeader)
		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{"error": err.Error()})
			c.Abort()
			return
		}
		fmt.Println("2:", tokenString)
		// 解析和验证 Token
		claims, err := utils.ParseToken(tokenString)
		if err != nil {
			c.JSON(http.StatusUnauthorized, gin.H{"error": "token 解析失败：Invalid or expired token"})
			c.Abort()
			return
		}

		// 将用户信息存储到上下文中
		c.Set("Id", claims.Id)
		c.Set("Username", claims.Username)
		c.Set("LoginId", claims.LoginId)
		c.Next()
	}
}

// 管理员权限检查中间件
func AdminCheck() gin.HandlerFunc {
	return func(c *gin.Context) {
		role, exists := c.Get("LoginId")
		if !exists || role != "admin" {
			c.JSON(http.StatusForbidden, gin.H{"error": "Admin access required"})
			c.Abort()
			return
		}
		c.Next()
	}
}
